package cn.gok.day7;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @ClassName HomeWork
 * @Description TODO
 * @Author HP
 * @Date 19:06 2022/7/12
 * @Version 1.0
 * 定义类Book:int bid,String name,float price
 * 除了 全参数构造外，还包含 public void sell(){ //显示本书被卖了}
 *  private  void sell(float price,String person)://显示本书卖给了xxx，卖了 xxx元
 * 通过反射实现：
 * 1 获取Book类信息，并获取全属性构造函数对象constructor
 *
 * 2 利用该构造对象，创建1个书的实例。
 *
 * 3 通过反射，分别获取两个sell方法对应的method对象，
 * 并破坏封装性，分别调用该方法。
 **/
public class HomeWork {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//        1 获取Book类信息，并获取全属性构造函数对象constructor
        Class c=Book.class;
        Constructor<Book> bookConstructor=c.getConstructor(int.class, String.class, float.class);
//        2 利用该构造对象，创建1个书的实例。
        Book book=bookConstructor.newInstance(194033531,"JavaEE",190.0F);
//        3 通过反射，分别获取两个sell方法对应的method对象
        System.out.println("public方法sell调用");
        Method m1=c.getDeclaredMethod("sell");
        m1.invoke(book);
        System.out.println("private方法sell调用");
        Method m2=c.getDeclaredMethod("sell",float.class,String.class);
        System.out.println("正在破坏封装性");
        m2.setAccessible(true);//破坏封装性
        try {
            m2.invoke(book,199.0F,"oscar");
        }catch (IllegalAccessException e) {
            System.out.println("发生错误"+e);
        }


    }

    private static void oneWork() {

    }
}
